home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update16.zoo / lib / bcopy.s next >
Encoding:
Text File  |  1992-03-06  |  2.8 KB  |  149 lines

  1. #APP
  2.  
  3. | void bcopy(void *src, void *dst, size_t cnt)
  4. |    handle overlap (both ways), odd/even alignment etc
  5. |    ++jrb    bammi@dsrgsun.ces.cwru.edu
  6. |
  7. |    modified to use, whenever possible, unrolled loops
  8. |    in both copy directions;
  9. |       no check for an overlap anymore, but copying goes
  10. |    up or down, depending on src-dst ordering;
  11. |    all loops recoded as (double) dbra loops;
  12. |    added entry point for 
  13. | void *memmove(void *dest, const void *src, size_t cnt);
  14. |    Michal Jaegermann ntomczak@vm.ucs.ualberta.ca
  15. |
  16.     .text
  17.     .even
  18.     .globl _bcopy
  19.     .globl _lbcopy
  20.     .globl _memmove
  21. _memmove:
  22.     movl    sp@(4),a1    | dst -> a1
  23.     movl    sp@(8),a0    | src -> a0
  24.     jra    L0
  25.  
  26. _bcopy:
  27. _lbcopy:
  28.     movl    sp@(4),a0    | src -> a0
  29.     movl    sp@(8),a1    | dst -> a1
  30. L0:
  31.     movl    sp@(12),d0    | cnt -> d0
  32.     jeq    return        | cnt == 0, nothing to do
  33.     cmpl    a1,a0        | which way to copy
  34.     jeq    return        | same source and destination? we are done
  35.     moveml    d2-d4/a1,sp@-    | save d2,d3,d4,a1(dst) - condition codes
  36.                 | are not affected
  37.     smi    d4        | d4 is set if we are going to copy down
  38.     jpl    L1
  39.     addl    d0,a0
  40.     addl    d0,a1
  41.  
  42. L1:
  43.     | check for odd src or dst
  44.     movw    a0,d1
  45.     movw    a1,d2
  46.     eorb    d1,d2
  47.     btst    #0,d2
  48.     jne    oddeven
  49.     btst    #0,d1        | do we have an extra byte?
  50.     jeq    setup
  51.     btst    #0,d4
  52.     jeq    upbyte
  53.     movb    a0@-,a1@-
  54.     jra    decrease
  55. upbyte:
  56.     movb    a0@+,a1@+
  57. decrease:
  58.     subql   #1,d0           | now even even
  59.  
  60. setup:
  61.     | if we are here we can unroll a copy loop
  62.     movl    d0,d2
  63.     lsrl    #5,d2        | how many times through a copy loop
  64.     movl    d2,d3        | get upper 16 bits of d2 into 
  65.     swap    d3        | lower word of d3
  66.  
  67.     | calculate loop offset - it has to be word anyway
  68.     movw    d0,d1
  69.     andw    #0x1c,d1    | 4 bytes/copy  32 bytes max/iter
  70.     lsrw    #1,d1        | calc index into loop (each movl == 2bytes)
  71.     negw    d1        |  
  72.     addw    #18,d1        | 16 + 2 bytes for jmp ext word - d1 == index
  73.  
  74.     btst    #0,d4
  75.     jeq    eveneven
  76.                 | drop into another loop to copy down
  77.     addw    #(loop2 - loop1),d1
  78.  
  79. eveneven:            | may want long alignment for 020/030 etc
  80.     jmp    pc@(0,d1:w)    | dive into a proper loop at appro spot
  81. loop1:
  82.     movl    a0@+,a1@+
  83.     movl    a0@+,a1@+
  84.     movl    a0@+,a1@+
  85.     movl    a0@+,a1@+
  86.  
  87.     movl    a0@+,a1@+
  88.     movl    a0@+,a1@+
  89.     movl    a0@+,a1@+
  90.     movl    a0@+,a1@+
  91.  
  92.     dbra    d2,loop1
  93.     dbra    d3,loop1
  94.  
  95.     btst    #1,d0
  96.     jeq    L4
  97.     movw    a0@+,a1@+    | residual word
  98. L4:    btst    #0,d0
  99.     jeq    ret
  100.     movb    a0@,a1@        | residual byte
  101. ret:
  102.     moveml    sp@+,d2-d4/a1
  103. return:
  104.     movl    a1,d0        | memmove returns its destination
  105.     rts
  106.  
  107. loop2:
  108.     movl    a0@-,a1@-
  109.     movl    a0@-,a1@-
  110.     movl    a0@-,a1@-
  111.     movl    a0@-,a1@-
  112.  
  113.     movl    a0@-,a1@-
  114.     movl    a0@-,a1@-
  115.     movl    a0@-,a1@-
  116.     movl    a0@-,a1@-
  117.  
  118.     dbra    d2,loop2
  119.     dbra    d3,loop2
  120.  
  121.     btst    #1,d0
  122.     jeq    L5
  123.     movw    a0@-,a1@-    | residual word
  124. L5:    btst    #0,d0
  125.     jeq    ret
  126.     movb    a0@-,a1@-    | residual byte
  127.     jra    ret
  128.     
  129. oddeven:
  130.     movl    d0,d1
  131.     swap    d1
  132.     btst    #0,d4
  133.     jne    downbra
  134.     jra    upbra
  135. upcopy:                | byte-by-byte forward
  136.     movb    a0@+,a1@+
  137. upbra:
  138.     dbra    d0,upcopy
  139.     dbra    d1,upcopy
  140.     jra    ret
  141.  
  142. downcopy:            | byte-by-byte backward
  143.     movb    a0@-,a1@-
  144. downbra:
  145.     dbra    d0,downcopy
  146.     dbra    d1,downcopy
  147.     jra    ret
  148.